package com.mall.module.user.mapper;

import com.mall.module.user.domain.entity.UserAsset;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;

@Mapper
public interface UserAssetMapper {

    /**
     * 通过资产ID查询用户资产
     *
     * @param assetId 资产ID
     * @return 用户资产
     */
    UserAsset selectById(@Param("assetId") Long assetId);

    /**
     * 通过用户ID查询用户资产
     *
     * @param userId 用户ID
     * @return 用户资产
     */
    UserAsset selectByUserId(@Param("userId") Long userId);

    /**
     * 插入用户资产
     *
     * @param userAsset 用户资产
     * @return 影响行数
     */
    int insert(UserAsset userAsset);

    /**
     * 更新用户资产
     *
     * @param userAsset 用户资产
     * @return 影响行数
     */
    int update(UserAsset userAsset);

    /**
     * 增加用户余额
     *
     * @param userId 用户ID
     * @param amount 增加金额
     * @param version 版本号
     * @return 影响行数
     */
    int increaseBalance(@Param("userId") Long userId, @Param("amount") BigDecimal amount, @Param("version") Integer version);

    /**
     * 减少用户余额
     *
     * @param userId 用户ID
     * @param amount 减少金额
     * @param version 版本号
     * @return 影响行数
     */
    int decreaseBalance(@Param("userId") Long userId, @Param("amount") BigDecimal amount, @Param("version") Integer version);

    /**
     * 增加用户积分
     *
     * @param userId 用户ID
     * @param points 增加积分
     * @param version 版本号
     * @return 影响行数
     */
    int increasePoints(@Param("userId") Long userId, @Param("points") Integer points, @Param("version") Integer version);

    /**
     * 减少用户积分
     *
     * @param userId 用户ID
     * @param points 减少积分
     * @param version 版本号
     * @return 影响行数
     */
    int decreasePoints(@Param("userId") Long userId, @Param("points") Integer points, @Param("version") Integer version);

    /**
     * 冻结用户余额
     *
     * @param userId 用户ID
     * @param amount 冻结金额
     * @param version 版本号
     * @return 影响行数
     */
    int freezeBalance(@Param("userId") Long userId, @Param("amount") BigDecimal amount, @Param("version") Integer version);

    /**
     * 解冻用户余额
     *
     * @param userId 用户ID
     * @param amount 解冻金额
     * @param version 版本号
     * @return 影响行数
     */
    int unfreezeBalance(@Param("userId") Long userId, @Param("amount") BigDecimal amount, @Param("version") Integer version);

    /**
     * 冻结用户积分
     *
     * @param userId 用户ID
     * @param points 冻结积分
     * @param version 版本号
     * @return 影响行数
     */
    int freezePoints(@Param("userId") Long userId, @Param("points") Integer points, @Param("version") Integer version);

    /**
     * 解冻用户积分
     *
     * @param userId 用户ID
     * @param points 解冻积分
     * @param version 版本号
     * @return 影响行数
     */
    int unfreezePoints(@Param("userId") Long userId, @Param("points") Integer points, @Param("version") Integer version);

    /**
     * 删除用户资产
     *
     * @param userId 用户ID
     * @return 影响行数
     */
    int deleteByUserId(@Param("userId") Long userId);
} 